﻿#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


////给你一个数组 nums 和一个值 val，你需要 原地 移除所有数值等于 val 的元素，并返回移除后数组的新长度。
////不要使用额外的数组空间，你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
////元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
//int removeElement(int* nums, int numsSize, int val) {
//    for (int i = 0; i < numsSize; i++) {
//        if (nums[i] == val) {
//            for (int j = i; j < numsSize - 1; j++) {
//                nums[j] = nums[j + 1];
//            }
//            i--;
//            numsSize--;
//        }
//    }
//    return numsSize;
//}

//int removeElement(int* nums, int numsSize, int val) {
//    int j = 0;
//    for (int i = 0; i < numsSize; i++) {
//        if (nums[i] != val) {
//            nums[j] = nums[i];
//            j++;
//        }
//    }
//    return j;
//}
//
//int main() {
//    int arr[] = { 0,1,2,2,3,4,5,2,7,8 };
//    int sz = sizeof(arr) / sizeof(arr[0]);
//    sz = removeElement(arr, sz, 2);
//    for (int i = 0; i < sz; i++) {
//        printf("%d ", arr[i]);
//    }
//	return 0;
//}

////给你一个 升序排列 的数组 nums ，请你 原地 删除重复出现的元素，使每个元素 只出现一次 ，返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
//int removeDuplicates(int* nums, int numsSize) {
//    int i = 0, j = 0;
//    while (j < numsSize) {
//        if (nums[i] == nums[j]) {
//            j++;
//        }
//        else {
//            nums[++i] = nums[j++];
//        }
//    }
//    return i + 1;
//}

//此处传入&a,&b
//tmp = a;
//a = b;
//b = tmp;
// 这里交换了a,b的值
// 
//原来pa存放的是a的地址，pb存放的是b的地址
//所以此处p1存放的是a的地址，p2存放的是b的地址
// tmp = *p1，即tmp=a
// 此处通过a,b的地址，解引用交换a,b的值
void swap(int* p1,int *p2) {
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

//此处传入&pa,&pb
//tmp = &pa
//&pa = &pb
//&pb = tmp;
// 这里交换了pa,pb的值，即a和b的地址
// 
//此处传入&pa和&pb，p1存放的是pa的地址，p2存放的是pb的地址
// tmp=*p1，即tmp=pa
// 此处通过pa,pb的地址，解引用交换pa,pb的值
// 然而pa中存放的是a的地址，pb中存放的是b的地址
// 交换后pa中存放的是b的地址，pb中存放的是a的地址
//
//void swap2(int** p1, int** p2) {
//	int *tmp = *p1;
//	*p1 = *p2;
//	*p2 = tmp;
//}

//如果写成这样，p1存放的是a的地址，p2存放的是b的地址
//tmp = p1，即tmp也存放了a的地址
//交换之后p1存放b的地址，p2存放a的地址
//然而虽然p1,p2变了，但是pa,pb没有变，仍然存放的是a,b的地址
void swap2(int* p1, int* p2) {
	int* tmp = p1;
	p1 = p2;
	p2 = tmp;
}


int main() {
	int a = 0, b = 1;
	int* pa = &a, * pb = &b;
	
	//swap(pa, pb);		//swap(&a,&b);

	swap2(pa, pb);
	printf("%d %d", *pa, *pb);
	return 0;
}